
/* multios.h: заголовочный файл, содержащий функции, требующие разной реализации для разных ОС */

#ifndef MULTIOS_H
#define MULTIOS_H

//==================================================================================================================
#include "preproc.h"		// подключение библиотеки с базовыми константами, макросами, типами данных и структурами
//==================================================================================================================

//================================= Функции компилируемые под платформу Windows =============================================
#ifdef _WIN32

	int get_fn(fn_node_t* ptr)														// функция подгрузки динамической библиотеки (.dll)
	{
		register usint i;

		for(i = 0; i < strlen(ptr->dll_path); ++i)									// циул обхода строки
			if(ptr->dll_path[i] == '/')												// проверка текущего символа (текущий символ - бэкслеш)
				ptr->dll_path[i] = '\\';											// замена символа на форвардслеш

		if(strspn(ptr->dll_path, WIN_LIB) >= 4)											// проверка добавления расширения (расширение не добавлено)
			ptr->dll_path = strncat(ptr->dll_path, WIN_LIB, 4);						// добавление расширения к имени библиотеки

		ptr->hlib = (void*) LoadLibrary(ptr->dll_path);								// загрузка библиотеки

		if(!(ptr->hlib))															// проверка загрузки библиотеки (библиотека не загружена)
			return ERROR;															// возвращаем код ошибки

		ptr->fn = (import_fn_t) GetProcAddress((HINSTANCE) ptr->hlib, ptr->fname);	// запись адреса функции

		if(!(ptr->fn))
			return ERROR;

		return SUCCESS;																// возвращаем код успешного завершения
	}

	int free_lib(fn_node_t* ptr)
	{
		if(ptr->hlib)
		{
			FreeLibrary((HINSTANCE) ptr->hlib);

			ptr->hlib	= NULL;
			ptr->fn		= NULL;

			return SUCCESS;
		}

		return ERROR;
	}

#endif
//===========================================================================================================================

//============================ Функции компилируемые под платформу Linux ================================================
#ifdef __linux__

	int get_fn(fn_node_t* ptr)								// функция подгрузки динамической библиотеки (.so)
	{
		register usint i;									// счетчик

		for(i = 0; i < strlen(ptr->dll_path); ++i)			// цикл обхода строки
			if(ptr->dll_path[i] == '\\')					// проверка текущего символа (текущий символ - бэкслеш)
				ptr->dll_path[i] = '/';						// замена символа на форвардслеш

		ptr->dll_path = strncat(ptr->dll_path, NIX_LIB, 3);	// добавление расширения к имени библиотеки

		if(!(ptr->hlib))									// проверка загрузки библиотеки (библиотека не загружена)
		{
			ptr->hlib = dlopen(ptr->dll_path, RTLD_LAZY);	// загрузка библиотеки

			if(!ptr->hlib)									// проверка загрузки библиотеки (библиотека не загружена)
				return ERROR;								// возвращаем код ошибки
		}

		ptr->fn = dlsym(ptr->hlib,ptr->name);				// запись адреса функции

		return SUCCESS;										// возвращаем код успешного завершения
	}

	void free_lib(fn_node_t* ptr)
	{
		if(ptr->hlib)
		{
			dlclose(ptr->hlib);

			return SUCCESS;
		}

		return ERROR;
	}
//=======================================================================================================================
#endif

#endif




